# -*- coding:utf-8 -*-

# 按行数拆分文件
import os  
import re  # 正则表达式模块 
from datetime import datetime

# 获取python脚本所在目录地址
def get_script_path():
    path = os.getcwd() #获取当前工作目录路径
    print('[INFO]: path=', path)
    return path

# 获取指定文件夹下的所有文本的绝对地址，并存入数组file_path  
def get_text_pathes(path = os.getcwd()):
    #  path=r'C:\Users\yuanlei\Desktop\new_file_txt'
    file_path=[]
    print('[INFO]: path=', path)
    for filename in os.listdir(path):     #获取path下所有文件的路径
            file_path.append((os.path.join(path,filename)))
    print('[INFO]: file_path=', file_path)
    return file_path

# 按行数拆分文件
def splits_file_by_specified_number_of_lines(source_file_path,target_dir,specified_number):
    # 源文件存放路径
    print('[INFO]: source_file_path=', source_file_path)
    # 处理完生成的文件存放目录路径
    print('[INFO]: target_dir=', target_dir)
    # 拆分时行数值
    print('[INFO]: specified_number=', specified_number)
    
    # 拆分文件路径去最后值获取文件名
    #  file_names_array = source_file_path.split('/')
    file_names_array = os.path.split(source_file_path) # 将全路径分解为（文件夹，文件名）的元组
    print('[INFO]: file_names_array=', file_names_array)
    file_name_full = file_names_array[1]
    print('[INFO]: file_name_full=', file_name_full)
    
    # 将文件名按.拆分出名称和扩展名
    file_names = file_name_full.split('.') 
    #  file_names = re.split('.',file_name_full)  # 使用正则表达式将文件名分解为文件名和扩展名
    print('[INFO]: file_names=', file_names)
    # 根据拆分后的数组长度来判断是否有扩展名
    file_names_length = len(file_names)
    print('[INFO]: file_names_length=', file_names_length)
    if file_names_length >= 2:
        # 将第一个值当作文件名
        file_name = file_names[0]
        print('[INFO]: file_name=', file_name)
        # 将最后一个值的作为扩展名
        file_name_extension = file_names[-1]
        print('[INFO]: file_name_extension=', file_name_extension)
    else:
        file_name = file_names[0]
        print('[INFO]: file_name=', file_name)
        

    # 计数器
    flag = 0
    # 切分文件顺序值
    file_split_number = 1
 
    # 存放数据
    data_list = []
    # 打开文件开始读入
    with open(source_file_path,'r', encoding='UTF-8') as f_source:
        for line in f_source:
            flag+=1
            # 将读取的文件一行一行读取保存
            data_list.append(line)
            # 如果计数器的值等于指定的行数
            if flag == specified_number:
                 # 拼接新的文件名
                if file_names_length >= 2: # 如果有文件扩展名
                    write_splits_name = target_dir+"/"+file_name+str(file_split_number)+"."+file_name_extension
                else:
                    write_splits_name = target_dir+"/"+file_name+str(file_split_number)
                # 开始写入
                with open(write_splits_name,'w+',encoding='UTF-8') as f_target:
                    for data in data_list:
                        f_target.write(data)
                file_split_number+=1
                flag = 0
                data_list = []
    # 处理最后一批行数少于200万行的
    if file_names_length >= 2: # 如果有文件扩展名
        write_splits_name = target_dir+"/"+file_name+str(file_split_number)+"."+file_name_extension
    else:
        write_splits_name = target_dir+"/"+file_name+str(file_split_number)
    ## 开始写入
    with open(write_splits_name,'w+',encoding='UTF-8') as f_target:
        for data in data_list:
            f_target.write(data)
 
# 主函数
def Main():
    print("[INFO]开始... Satrt...")
    print(datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
    ## 获取当前脚本所在目录路径
    script_path = get_script_path()
    print('[INFO]: script_path=', script_path)
    ## 将脚本所在路径加上一个文件夹名
    # 源文件存放目录路径
    source_dir = script_path+ "/org"
    print('[INFO]: source_dir=', source_dir)
    # 处理完生成的文件存放目录路径
    target_dir = script_path+ "/split"
    print('[INFO]: target_dir=', target_dir)
    
    # 获得需处理的文件的列表
    path_list = get_text_pathes(source_dir)
    print('[INFO]: path_list=',path_list)

    # 指定按多少行拆分
    specified_number=50

    # 对每个文本调用正则函数进行拆分
    for one_file_address in path_list:
        print("[INFO]开始拆分",one_file_address)
        splits_file_by_specified_number_of_lines(one_file_address,target_dir,specified_number)
        print(datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
        print("[INFO]拆分完",one_file_address)
    print(datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
    print("[INFO]The End.")

if __name__ == "__main__":
    Main()


